package cn.cn77.futures;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Window;
import android.widget.Toast;
import cn.cn77.futures.utils.C2Sever;
import cn.cn77.futures.utils.UserSharedPreference;
import cn.cn77.futures.utils.Utils;

import com.ta.util.http.AsyncHttpClient;
import com.ta.util.http.AsyncHttpResponseHandler;
import com.ta.util.http.RequestParams;

/**
 * 基础的Activity类，其他的所有Activity都继承这个类,方便使用这些公共的方法及变量
 * 
 * @author sun
 */
public class BaseActivity extends FragmentActivity {
	protected Vibrator vibrator;
	private AsyncHttpClient client;
	protected RequestParams mParams;
	private String mUrl;
	public String UserId;
	// private String postCode;

	private static Toast mToast;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		client = new AsyncHttpClient();
		mParams = new RequestParams();
		vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
		Log.i("baseActivity", "onCreate");
	}

	/**
	 * 设置网络访问的Url
	 * 
	 * @param controller
	 *            控制器
	 * @param action
	 *            方法
	 */
	protected void setUrl(String controller, String action) {
		mUrl = C2Sever.getUrl(controller, action);
	}

	/**
	 * Activity间的跳转函数
	 * 
	 * @param fromActivity
	 *            起始Activity，即从哪个Activity进行跳转
	 * @param toActivityClass
	 *            目标Activity
	 * @param arguments
	 *            跳转时需要传递的参数,如果没有参数传递，则为null
	 */
	public void toActivity(Context fromActivity, Class toActivityClass,
			Bundle arguments) {
		Intent intent = new Intent();
		intent.setClass(fromActivity, toActivityClass);
		if (arguments != null) {
			intent.putExtra("arguments", arguments);
		}
		startActivity(intent);
	}

	protected void toActivity(Context fromActivity, Class toActivityClass) {
		toActivity(fromActivity, toActivityClass, null);
	}

	/**
	 * 基础的异步post方法
	 * 
	 * @param activity
	 *            调用该方法的activity
	 * @param mUrl
	 *            请求数据的url地址
	 * @param params
	 *            请求参数
	 * @param statusCode
	 *            同一个activity中多个网络请求的区别码
	 */
	private void doAsyncPost(final BaseActivity activity, String url,
			RequestParams params, final int status) {
		client.setTimeout(5000);
		Log.i("网络操作", "发送到服务器的参数为：" + params.toString());
		client.post(activity, url, params, new AsyncHttpResponseHandler() {

			@Override
			public void onSuccess(int statusCode, String content) {
				super.onSuccess(statusCode, content);
				Log.i("状态码", statusCode + "");
				if (content != null) {
					try {
						Log.i("网络操作", "接收到的数据为：" + content);
						JSONObject o = new JSONObject(content);
						String success = o.getString(C2Sever.Field.Success);
						switch (success) {
						case "1":
							String data = o.getString(C2Sever.Field.Other);
							String msg = o.getString(C2Sever.Field.Message);
							if (null == data) {
								// 判断出服务器没有数据，直接打印出返回的成功信息
								if (msg != null)
									showToast(msg);
								successWithoutData(status);
							} else {
								if (msg != null)
									showToast(msg);
								successWithData(o, status);
							}
							break;
						case "0":
							// success为0时一般只需要打印服务器返回信息即可。如有其他操作则执行testFailure();
							showToast(o.getString(C2Sever.Field.Message));
							Log.e("网络操作",
									"接收数据：success为0："
											+ o.getString(C2Sever.Field.Message));
							failureTest(o, status);
							break;
						default:
							break;
						}

					} catch (JSONException e) {
						Log.e("网络操作",
								"接收到的数据" + content + "----------"
										+ e.toString());
					}
				} else {
					Log.i("BaseActivity", "网络访问成功");
				}
			}

			@Override
			public void onFailure(Throwable error, String content) {
				super.onFailure(error, content);
				if (content == null) {
					showToast("~网络连接异常,请先检查网络~");
				} else {
					Log.i("async post onFailure", error.toString()
							+ ",content=" + content);
					showToast("~网络连接异常,请先检查网络~");
					failure(content);
				}
			}
		});
	}

	/**
	 * 自动检查登录与否，并可以在一个页面执行多次操作
	 * 
	 * @param activity
	 * @param status
	 */
	protected void doAsyncPost(BaseActivity activity, int status) {
		if (mUrl != null) {
			if (isLogined()) {// 登录后操作都需要发送UserId和postCode
				String timeStamp = UserSharedPreference.getParams(
						UserSharedPreference.TimeStamp, this);
				String postCode = Utils.postCode(UserId, timeStamp);
				mParams.put(C2Sever.Field.Uid, UserId);
				mParams.put(C2Sever.Field.PostCode, postCode);
				// 执行登录操作
				doAsyncPost(activity, mUrl, mParams, status);
			} else if (mParams != null) {// 未登录操作参数不为空
				doAsyncPost(activity, mUrl, mParams, status);
			} else {
				Log.w("网络操作", "没有添加参数");
				doAsyncPost(activity, mUrl, null, status);
			}
		} else {
			showToast("没有执行setUrl()方法");
		}
	}

	/**
	 * 登录检查
	 */
	private boolean isLogined() {
		UserId = UserSharedPreference.getParams(UserSharedPreference.USER_ID,
				this);
		if (UserId == null) {
			Log.w("网络操作", "执行未登录操作");
			return false;
		} else {
			Log.w("网络操作", "已登录操作");
			return true;
		}
	}

	/**
	 * 同一界面下只执行一次网络操作，Url通过使用setUrl方法设置，参数直接使用mParams变量进行修改定义，无需清空，
	 * 成功后的返回结果通过继承success的两个方法进行处理
	 * 
	 * @param activity
	 */
	protected void doAsyncPost(BaseActivity activity) {
		doAsyncPost(activity, 0);
	}

	/**
	 * 将内容以Toast形式显示出来
	 * 
	 * @param content
	 */
	public void showToast(String content) {
		if (mToast == null) {
			mToast = Toast.makeText(this, content, Toast.LENGTH_SHORT);
		} else {
			mToast.cancel();
			mToast = Toast.makeText(this, content, Toast.LENGTH_SHORT);
		}
		mToast.show();
	}

	/**
	 * 执行异步Post网络通信成功之后，针对每次网络操作的识别码，分别对内容进行操作
	 * 
	 * @param data
	 *            Json对象
	 * @param status
	 */
	protected void successWithData(JSONObject data, int status) {

	}

	/**
	 * success代码为1，但是没有内容的成功方法
	 * 
	 * @param status
	 */
	protected void successWithoutData(int status) {
	}

	/**
	 * 执行异步Post网络通信失败后，对内容的操作
	 * 
	 * @param content
	 */
	protected void failure(String content) {

	}

	/**
	 * 一般用来对测试失败的结果进行处理
	 * 
	 * @param o
	 * @param status
	 */
	protected void failureTest(JSONObject o, int status) {

	}

	public void successWithData() {
		// TODO Auto-generated method stub

	}
}
